package study.top.mydb;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.top.common.DBHandler;
import study.top.common.DateTime;
import study.top.mydb.items.WishListShowItem;

/**
 * 
 * @author JJUNG
 * 
 */
public class WishListProduct {
	static Logger logger = Logger.getLogger(WishListProduct.class);
	// 데이터베이스 제어 객체에 대한 참조
	DBHandler db = null;

	public WishListProduct() {
		// DB객체에 대한 참조 연걸
		db = DBHandler.getInstance();
	}

	/**
	 * 위시리스트 상품 추가
	 * 
	 * @param wishList_seq
	 *            위시리스트 일련번호
	 * @param product_seq
	 *            상품일련번호
	 * @return int seq 생성된 일련번호
	 */
	private static final String TABLE = "wishlist_has_product";
	private ArrayList<String> codeList = new ArrayList<String>();// 상품의 코드가 저장됨
	private ArrayList<Integer> numberList = new ArrayList<Integer>();// 상품의 수량이
																		// 저장됨

	public int add(int wishList_seq, int product_seq, int rank, int qty) {
		// 리턴할 값 선언
		int seq = -1;
		// -----------------------------------------
		// 메서드 시작
		// -----------------------------------------
		logger.debug("==========method start >> add");

		logger.debug("[PARAMS] wishList_seq=" + wishList_seq);
		logger.debug("[PARAMS] product_seq=" + product_seq);
		logger.debug("[PARAMS] rank=" + rank);
		logger.debug("[PARAMS] qty=" + qty);

		int prono = db.getMax(TABLE, "seq", null) + 1;

		logger.debug("위시리스트에 자동 생성된 상품번호 : " + prono);

		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO wishlist_has_product(wishList_seq, product_seq, rank,qty, "
				+ "reg_date,edit_date) VALUES (%d, %d,%d,%d,'%s','%s');";

		String date = DateTime.getInstance().getNowDateTimeString();
		boolean result = db.execSql(sql, wishList_seq, product_seq, rank, qty,
				date, date);

		// -----------------------------------------
		// 결과처리
		// -----------------------------------------
		if (result) {
			seq = prono;
			db.commit();
			logger.debug("처리결과 >> " + wishList_seq + "번 위시리스트에" + product_seq
					+ "번 상품 등록 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 위시리스트에 상품등록 실패");
		}

		logger.debug("==========method end >> add");
		return seq;
	}

	/**
	 * 위시리스트 상품 수정
	 * 
	 * @param wishList_seq
	 *            위시리스트 일련번호
	 * @param product_seq
	 *            상품 일련번호
	 * @return boolean result 상품의 수정여부
	 */
	public boolean edit(int seq, int wishList_seq, int product_seq, int rank,
			int qty) {

		logger.debug("==========method start >> edit");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] wishList_seq=" + wishList_seq);
		logger.debug("[PARAMS] product_seq=" + product_seq);
		logger.debug("[PARAMS] rank=" + rank);
		logger.debug("[PARAMS] qty=" + qty);

		boolean result = false;

		db.beginTrans();

		String sql = "UPDATE wishlist_has_product SET product_seq = %d,  edit_date = '%s',rank=%d,qty=%d WHERE wishList_seq = %d and seq= %d;";

		// reg_date, edit_date를 생성해서 리턴
		String date = DateTime.getInstance().getNowDateTimeString();

		result = db.execSql(sql, product_seq, date, rank, qty, wishList_seq,
				seq);

		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + wishList_seq + "번 위시리스트 상품수정 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> " + wishList_seq + "번 위시리스트 상품수정 실패");
		}
		logger.debug("==========method end >> edit");
		return result;
	}

	/**
	 * 회원별 위시리스트 상품 조회
	 * 
	 * @param wishlist_seq 위시리스트 일련번호
	 * @param seq 상품 일련번호
	 * @return
	 */
	public WishListShowItem wishListMember(int wishlist_seq,int seq) {
		logger.debug("==========method start >> wishListMember");
		logger.debug("[PARAMS] wishlist_seq=" + wishlist_seq);
		logger.debug("[PARAMS] wishlist_seq=" + seq);

		WishListShowItem item = null;

		String sql = "SELECT wishlist_seq,p.seq,whp.seq, m.name,p.title,rank,p.price_min,qty,p.price_min*qty*0.05,price_min*qty FROM wishlist_has_product whp, "
				+ "member m,product p "
				+ "WHERE m.seq=wishlist_seq and p.seq=whp.product_seq and wishlist_seq=%d and p.seq=%d;";
		ResultSet rs = db.getResult(sql, wishlist_seq,seq);
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int wishlistno = rs.getInt(1);
					int pseq = rs.getInt(2);
					int sno = rs.getInt(3);
					String name = rs.getString(4);
					String title = rs.getString(5);
					int rank = rs.getInt(6);
					int price_min = rs.getInt(7);
					int qty = rs.getInt(8);
					int point = rs.getInt(9);
					int p_sum = rs.getInt(10);
					// 2) 추출된 값을 객체로 구성
					item = new WishListShowItem(wishlistno,
							pseq, sno, name, title, rank, price_min, qty,
							point, p_sum);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if(item == null) {
			logger.error("회원 검색 실패");
		} else {
			logger.debug("회원 검색 성공");
			logger.debug(item.toString());
		}

		logger.debug("==========method end >> show");
		return item;
	}

	public ArrayList<WishListShowItem> wishListMember(int wishlist_seq) {
		logger.debug("==========method start >> wishListMember");
		logger.debug("[PARAMS] wishlist_seq=" + wishlist_seq);

		ArrayList<WishListShowItem> list = null;

		String sql = "SELECT wishlist_seq,p.seq,whp.seq, m.name,p.title,rank,p.price_min,qty,p.price_min*qty*0.05,price_min*qty FROM wishlist_has_product whp, "
				+ "member m,product p "
				+ "WHERE m.seq=wishlist_seq and p.seq=whp.product_seq and wishlist_seq=%d;";
		ResultSet rs = db.getResult(sql, wishlist_seq);
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<WishListShowItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출
					int wishlistno = rs.getInt(1);
					int pseq = rs.getInt(2);
					int sno = rs.getInt(3);
					String name = rs.getString(4);
					String title = rs.getString(5);
					int rank = rs.getInt(6);
					int price_min = rs.getInt(7);
					int qty = rs.getInt(8);
					int point = rs.getInt(9);
					int p_sum = rs.getInt(10);
					// 2) 추출된 값을 객체로 구성
					WishListShowItem item = new WishListShowItem(wishlistno,
							pseq, sno, name, title, rank, price_min, qty,
							point, p_sum);

					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("회원별 위시리스트 조회 실패");
		} else {
			logger.debug("회원별 위시리스트 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("==========method end >> wishListMember");
		return list;
	}

	public ArrayList<WishListShowItem> payment(int seq) {
		logger.debug("==========method start >> wishListMember");

		logger.debug("[PARAMS] member_seq=" + seq);

		ArrayList<WishListShowItem> list = null;

		String sql = "SELECT wishlist_seq,whp.seq,p.seq, m.name,p.title,rank,p.price_min,qty,p.price_min*0.05,price_min*qty FROM wishlist_has_product whp, "
				+ "member m,product p "
				+ "WHERE m.seq=wishlist_seq and p.seq=whp.product_seq and whp.seq=%d;";
		ResultSet rs = db.getResult(sql, seq);
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<WishListShowItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출
					int wishlistno = rs.getInt(1);
					int sno = rs.getInt(2);
					int pseq = rs.getInt(3);
					String name = rs.getString(4);
					String title = rs.getString(5);
					int rank = rs.getInt(6);
					int price_min = rs.getInt(7);
					int qty = rs.getInt(8);
					int point = rs.getInt(9);
					int p_sum = rs.getInt(10);
					// 2) 추출된 값을 객체로 구성
					WishListShowItem item = new WishListShowItem(wishlistno,
							sno, pseq, name, title, rank, price_min, qty,
							point, p_sum);
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("회원별 결제창 조회 실패");
		} else {
			logger.debug("회원별 결제창 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("==========method end >> wishListMember");
		return list;
	}

	/**
	 * 위시리스트 상품 상품삭제
	 * 
	 * @param wishList_seq
	 *            위시리스트 일련번호
	 * @param product_seq
	 *            상품 일련번호
	 * @return boolean result 삭제여부
	 */
	public boolean WishListProductDelete(int wishList_seq, int seq) {
		boolean result = false;
		logger.debug("==========method start >> delete");
		logger.debug("[PARAMS] wishList_seq=" + wishList_seq);
		logger.debug("[PARAMS] product_seq=" + seq);

		db.beginTrans();

		String sql = "DELETE FROM wishlist_has_product WHERE wishList_seq =%d and seq = %d";

		result = db.execSql(sql, wishList_seq, seq);

		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 상품 위시리스트에서 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 위시리스트에서 상품 선택삭제 실패 ");
		}
		logger.debug("==========method end >> delete");
		return result;
	}

	/**
	 * 위시리스트 상품 상품삭제
	 * 
	 * @param wishList_seq
	 *            위시리스트 일련번호
	 * @param product_seq
	 *            상품 일련번호
	 * @return boolean result 삭제여부
	 */
	public boolean PayOkDelete(int wishList_seq, int product_seq) {
		boolean result = false;
		logger.debug("==========method start >> delete");
		logger.debug("[PARAMS] wishList_seq=" + wishList_seq);
		logger.debug("[PARAMS] product_seq=" + product_seq);

		db.beginTrans();

		String sql = "DELETE FROM wishlist_has_product WHERE wishList_seq =%d and product_seq = %d";

		result = db.execSql(sql, wishList_seq, product_seq);

		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + product_seq + "번 상품 위시리스트에서 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 위시리스트에서 상품 선택삭제 실패 ");
		}
		logger.debug("==========method end >> delete");
		return result;
	}

}
